perm filename LISTFO.FAI[XGP,BGB] blob sn#036593 filedate 1973-05-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE LISTFONT
C00005 00003	BEGIN LOOP
C00012 00004	NSUBR PUTCHR,CHAR
C00013 00005	NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE 
C00015 00006	DATA AREA
C00016 ENDMK
C⊗;
	TITLE LISTFONT

IFNDEF DEBUG,<↓DEBUG←0
>

START:	MOVE P,[IOWD PLEN,PLIST]
	RESET
	INIT 17				;READ IN FONT FILE
	SIXBIT/DSK/
	0
	FATAL(CAN'T INIT DSK)
START2:	OUTSTR[ASCIZ/FONT FILE = /]
	CALL(GETFIL)
	EXIT
	LOOKUP FILNAM
	GO [ HLLZ EXTION
	     JUMPE [ MOVSI 'FNT'
		     MOVEM EXTION
		     LOOKUP FILNAM
		     GO NOEXT
		     GO LOOKOK]
     NOEXT:  SKIPE PPPN
	     GO [ NOTFND: OUTSTR[ASCIZ/FILE NOT FOUND.
/]↔			  GO START2 ]
	     MOVE [SIXBIT/FNTTVR/]
	     MOVEM PPPN
	     SETZ
	     GETPPN
	     ANDI 777777
	     CAIN 'TVR'
	     LOOKUP FILNAM
	     GO [ MOVE [SIXBIT/XGPSYS/]
		  MOVEM PPPN
		  LOOKUP FILNAM
		  GO NOTFND
		  GO LOOKOK]
	     GO LOOKOK]
LOOKOK:	HLRE PPPN			;GET SOME CORE FOR FONT FILE
	MOVN
	ADD JOBFF
	PUSH P,
	CORE
	FATAL(NOT ENOUGH CORE!)
	MOVE JOBFF
	MOVEM BUFPTR
	POP P,JOBFF
	SUBI 1
	HLL PPPN
	SETZ 1,
	IN 0
	SKIPA
	FATAL(READ ERROR?)
	RELEASE 0,
	INIT 1,				;SETUP OUTPUT FILE
	SIXBIT/DSK/
	OHDR,,0
	FATAL(CAN'T INIT DSK)
	ENTER 1,[SIXBIT/QQFLISRPG/↔0↔0]
	FATAL(CAN'T WRITE OUTPUT FILE!)
	SETOM TOPTAB
	MOVE [XWD TOPTAB,TOPTAB+1]
	BLT TOPTAB+177
	OUTSTR[ASCIZ/OPTION(L-LPT,T-TTY,X-XGP)?/]
	SETZ 1,
	INCHRW
	ANDI 137
	CAIN "L"
	MOVEI 1,1
	CAIN "X"
	MOVEI 1,2
	MOVEM 1,OUTYPE#
	MOVE [=72↔=120↔=1400/6](1)
	MOVEM XMAX
	SETZM LPTSW
	CAIN 1,1
	SETOM LPTSW#
	SETZM XGPSW
	CAIN 1,2
	SETOM XGPSW#
	OUTSTR[ASCIZ/
/]
BEGIN LOOP
	ACCUMULATORS{CHAR1,CHARX,X,Y,BUF,ADR}
	DEFINE OUTFIL(CHAR)
<	SOSG OHDR+2
	OUT 1,
	SKIPA
	FATAL(WRITE ERROR!)
	IDPB CHAR,OHDR+1
IFN DEBUG,<OUTCHR CHAR
>>
	MOVE BUF,BUFPTR
	HRLI BUF,CHARX
	SOS 203(BUF)		;FUDGE FACTOR
	INSKIP			;IF NO TYPE AHEAD THEN
	OUTSTR 240(BUF)		;TYPE THE DESCRIPTION
	OUTSTR[ASCIZ/
/]				;JUST IN CASE THERE WASN'T ONE IN DESCRPITION
	SETZ CHAR1,
MAIN:	SETZ Y,			;THE MAIN LOOP
	CALL(BOARDER)
YLOOP:	JUMPE Y,YL1
	CALL(PUTCHR,[15])
	SKIPN LPTSW
	GO [CALL(PUTCHR,[12])
	    GO YL1]
	CALL(PUTCHR,[177])
	CALL(PUTCHR,[21])
YL1:	CAMLE Y,201(BUF)		;THIS GROUP OF CHARACTERS DONE YET?
	GO [ CAIL CHARX,200		;YES, ARE WE DONE WITH FONT?
	     GO [ RELEASE 1,
		  MOVE 1,OUTYPE
		  PTWRS7 @[[ 0↔[ASCIZ/TRAN TTY:←QQFLIS.RPG/](1)]
		  	   [ 0↔[ASCIZ"SPOOL QQFLIS.RPG/B/D"]]
		  	   [ 0↔[ASCIZ"TRAN XGP:←QQFLIS.RPG/FONT=LISTFONT[FNT,TVR]/EXTRA≡0"]]](1)
		  EXIT ]
	     MOVE CHAR1,CHARX	;SET CHAR1 TO FIRST OF NEXT GROUP
	     GO MAIN ]		;DO NEXT GROUP
	CAME Y,201(BUF)		;TIME TO DO BOTTOM LINE OR
	CAMN Y,203(BUF)		;TIME TO DO THE BASE LINE?
	CALL(BASELINE)		;YEP
	SETZ X,
	MOVE CHARX,CHAR1	;THE ROW LOOP
CLOOP:	HRRZ ADR,@BUF		;THE CHARACTER LOOP
	JUMPE ADR,[AOJA CHARX,CLOOP]	;SKIP UNDEF CHARACTER
	ADDI ADR,(BUF)
	CALL(PUTCHR,["|"])	;OUTPUT BOARDER
	CAIL CHARX,200		;END TEST
	AOJA Y,YLOOP		;THIS ROW DONE
	HLRE 1,@BUF		;GET WIDTH
	ADDI X,1(1)		;ADD WIDTH+1 TO X
	CAMLE X,XMAX		;TOO BIG?
	GO [ CAIN X,1(1)		;YES, IS CHARACTER TOO BIG
	     FATAL(CHARACTER TOO WIDE!)	;LOSE BIG
	     AOJA Y,YLOOP ]		;THIS ROW DONE
	SKIPGE 1,TOPTAB(CHARX)	;ARE WE SET UP FOR THIS ROW?
	JUMPL 1,[ HLRZ (ADR)		;NO, DO SETUP
		  CAME CHARX		;A LITTLE BIT OF CHECKING...
		  GO [ OUTSTR[ASCIZ/BAD FONT FILE. ADDRESS TABLE INVALID.
FIRST LOSING CHARACTER = '/]
		       OUTCHR CHARX
		       OUTCHR ["'"]
		       EXIT 1,
		       GO $.-1]
		  HLRE 1,1(ADR)		;SETUP TOP COUNT
		  MOVEM 1,TOPTAB(CHARX)
		  HRRE 0,1(ADR)		;SETUP ROW COUNT
		  MOVEM 0,ROWTAB(CHARX)
		  ADD 0,1
		  CAMLE 0,201(BUF)	;SOME MORE CHECKING
		  GO [ OUTSTR[ASCIZ/TOP_COUNT+ROW_COUNT>MAXHEIGHT.  CHARACTER = '/]
		       OUTCHR CHARX
		       OUTSTR[ASCIZ/'
/]↔		       GO CL1 ]
	     CL1: HRRZ 0,ADR		;SET UP BYTE POINT
		  ADD 0,[POINT 1,2,-1]
		  MOVEM 0,PTRTAB(CHARX)
		  MOVEI 0,=36		;CALCULATE BYTES/WORD
		  HLRE 1,@BUF
		  IDIV 0,1
		  MOVEM 0,BYTTAB(CHARX)	;SAVE IT
		  MOVEM 0,REMTAB(CHARX)	;SET UP BYTES REMAINING TOO
		  MOVE 1,TOPTAB(CHARX)
		  GO CL2 ]
CL2:	HLRE 0,@BUF		;SETUP TO DO COLUMN LOOP
	JUMPG 1,[ SOS TOPTAB(CHARX)	;STILL ON TOP OF CHARACTER
		  GO BLANK ]		;A BLANK LINE FOR THIS CHARACTER
	SOSGE ROWTAB(CHARX)	;ANYTHING LEFT IN THIS CHARACTER?
	GO BLANK		;NO
XLOOP:	ILDB 1,PTRTAB(CHARX)
	MOVE 1,[" "↔"*"](1)
	OUTFIL 1
;	CALL(PUTCHR,<[" "↔"*"](1)>)
	SOJG 0,XLOOP
	SOSLE REMTAB(CHARX)	;IS WORD EXHAUSTED?
	AOJA CHARX,CLOOP	;NO
	MOVE 1,BYTTAB(CHARX)	;YES, RESET BYTES REMAINING
	MOVEM 1,REMTAB(CHARX)
	MOVSI 1,770000		;SET POINTER TO NEXT WORD BOUNDARY
	ANDCAM 1,PTRTAB(CHARX)
	AOJA CHARX,CLOOP	;DO NEXT CHARACTER
BLANK:	MOVEI 1," "
	OUTFIL 1
	SOJG 0,BLANK+1
;	CALL(PUTCHR,[" "])	;PUT OUT A BLANK ROW
;	SOJG 0,BLANK
	AOJA CHARX,CLOOP	;DO NEXT CHARACTER

NSUBR BASELINE
;CLOBBERS 0,1
;CALL PUTCHR
	GLOBAL CHARX,CHAR1,ADR,X
	MOVE CHARX,CHAR1	;THE ROW LOOP
	SETZ X,
CLOOP:	HRRZ 1,@BUF		;THE CHARACTER LOOP
	JUMPE 1,[AOJA CHARX,CLOOP]	;SKIP UNDEF CHARACTER
	CAIL CHARX,200		;END TEST
	GO CFIN			;THIS ROW DONE
	HLRE 1,@BUF		;GET WIDTH
	ADDI X,1(1)		;ADD WIDTH+1 TO X
	CAMLE X,XMAX		;TOO BIG?
	GO [ CAIN X,1(1)		;YES, IS CHARACTER TOO BIG
	     FATAL(CHARACTER TOO WIDE!)	;LOSE BIG
	     GO CFIN ]		;THIS ROW DONE
	MOVE 0,X
	AOJA CHARX,CLOOP
CFIN:	CALL(PUTCHR,[" "])
	SKIPE XGPSW
	GO [ CALL(PUTCHR,[177])
	     CALL(PUTCHR,[1])
	     CALL(PUTCHR,[41])
	     CALL(PUTCHR,[6])
	     SUBI 0,1
	     IMULI 0,6
	     MOVE 1,0
	     ASH 1,-7
	     CALL(PUTCHR,1)
	     CALL(PUTCHR,0)
	     CALL(PUTCHR,[15])
	     POP0J]
	MOVEI 1,"_"
CL2:	SOJLE 0,[ CALL(PUTCHR,[15])
		  POP0J]
;	CALL(PUTCHR,["_"])
	OUTFIL 1
	GO CL2
SUBREND BASELINE

NSUBR BOARDER
;CALL BASELINE,PUTCHR
	CALL(BASELINE)
	SKIPN LPTSW
	GO [CALL(PUTCHR,[12])
	    POP0J]
	CALL(PUTCHR,[177])
	CALL(PUTCHR,[21])
	POP0J
SUBREND BOARDER
BEND LOOP
NSUBR PUTCHR,CHAR
;AC TRANSPARENT
;DOES NOT CALL ANYTHING
	SOSG OHDR+2
	OUT 1,
	GO PUTCH2
	FATAL(WRITE ERROR?)
PUTCH2:	EXCH CHAR
	IDPB OHDR+1
	EXCH CHAR
IFN DEBUG,<OUTCHR CHAR
>
	POP1J]
SUBREND PUTCHR
NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE 

	SETZM FILNAM↔SETZM EXTION
	SETZM EXTION+1↔SETZM PPPN
;	CRLF
	MOVE 4,[POINT 6,FILNAM,-1]↔MOVEI 2,6
	INCHWL 1↔CAIN 1,15↔GO[INCHWL↔POP0J]↔AOS(P)
	JRST L+1
L:	INCHWL 1
	CAILE 1,"z"↔POP0J
	CAIL 1,"a"↔SUBI 1,40		;CONVERT LOWER CASE
	CAIN 1,"."↔GO[MOVE 4,[POINT 6,EXTION,-1]↔MOVEI 2,3↔GO L]
	CAIN 1,"["↔GO[MOVE 4,[POINT 6,PPPN,-1]  ↔MOVEI 2,3↔GO L]
	CAIN 1,","↔GO[HLRZ PPPN
		      PUSHJ P,[PPJUST:	JUMPE [OUTSTR[ASCIZ/BAD P,PN/]
						CLRBFI↔SOS -1(P)↔CRLF↔POP1J]	
		   	 		TRNE 77↔POP0J↔LSH -6↔GO PPJUST]
		      HRLM PPPN↔MOVE 4,[POINT 6,PPPN,17]↔MOVEI 2,3↔GO L]
	CAIN 1,"]"↔GO[HRRZ PPPN↔CALL(PPJUST)
		   HRRM PPPN↔INCHWL 1↔GO FINQ]
FINQ:	CAIN 1,15↔GO EOL			;END OF THE LINE.
	CAIN 1,12↔POP0J
;	CAIN 1,"→"↔POP0J
	CAIG 1," "↔GO L	;IGNORE GARBAGE.
	SOJL 2,L↔SUBI 1,40↔IDPB 1,4↔GO L

EOL:	INCHWL 1↔POP0J
SUBREND GETFIL;1/31/73(BGB),2/7/73(TVR)
;DATA AREA

PLIST:	BLOCK 20	;PUSHDOWN LIST
PLEN←←.-PLIST

TOPTAB:	BLOCK 200	;TABLE OF COUNT FROM TOP
ROWTAB:	BLOCK 200	;TABLE OF ROWS REMAINDER
PTRTAB:	BLOCK 200	;BYTE POINTER FOR EACH CHARACTER
BYTTAB:	BLOCK 200	;BYTES/WORD FOR EACH CHARACTER
REMTAB:	BLOCK 200	;NUMBER OF BYTES REMAINDING IN A WORD

BUFPTR:	BLOCK 1

OHDR:	BLOCK 3

XMAX:	=120

FILNAM:	BLOCK 1
EXTION:	BLOCK 2
PPPN:	BLOCK 2

	TAIL
END START